581. 最短无序连续子数组
581. 最短无序连续子数组
Similar Question
Solution Tips
方案一: 排序 + Diff 对比
排序后比对最左和最右的变化,中间即是
var findUnsortedSubarray = function(nums) {
const sorted = [...nums].sort((a,b)=>a-b)
let left = null
for (let i = 0; i < nums.length; i++) {
if(nums[i]!==sorted[i]){
left = i
break
}
}
let right = null
for (let i = nums.length-1; i > 0; i--) {
if(nums[i]!==sorted[i]){
right = i
break
}
}
// 如果是已排序的,left和right都是null
// 如果是顶点不同,left和right等于length
return left===null?0:right - left + 1
}
方案二: 双指针
从左往右找到第一个不在正确位置的大值
var findUnsortedSubarray = function(nums) {
const len = nums.length
//结束值赋为-2是考虑在数组本身就是有序时,return也可以给出正确值
let start =-1,
end = -2
max = nums[0],
min = nums[len-1]
for (let i = 0,j=len-1; i < nums.length && j>=0; i++,j--) {
if(max>nums[i]) end = i
else max = nums[i]
if(min<nums[j]) start = j
else min = nums[j]
}
return end - start + 1
}